#include <iostream>
using std::cout;
using std::endl;

#include <unistd.h>
#include <signal.h>

#include <sys/types.h>
#include <sys/wait.h>

// //int flag = 1;
// volatile int flag = 1; //告诉编译器不要优化 不要设置内存不可见

// void handler(int signo)
// {
//     flag = 0;
//     cout<<"触发:"<<signo<<"信号!"<<" flag:"<<flag<<endl;
// }

// //触发信号修改全局变量停止循环 -- 对于编译器，使用-O0和O1进行优化 查看现象
// int main()
// {
//     signal(SIGINT,handler);
//     while(flag);

//     return 0;
// }


// //子进程向父进程发送信号时 父进程循环也退出
// int flag = 1;
// void handler(int signo)
// {
//     cout<<"子进程信号:"<<signo<<endl;
//     flag = 0;
// }

// //子进程运行完毕后会向父进程发送信号
// int main()
// {
//     signal(SIGCHLD,handler);
//     pid_t id = fork();
//     if(id == 0)
//     {
//         int i = 5;
//         while(i--)
//         {
//             cout<<"id2进程行中..."<<endl;
//             sleep(1);
//         }
//         exit(1);
//     }

//     while(flag)
//     {
//         cout<<"主进程行中..."<<endl;
//         sleep(1);
//     }

//     return 0;
// }





void handler(int signo) //循环回收一批子进程 子进程同时退出
{    
    while(true) //如果不使用循环去轮询回收子进程 则因为信号无法被重复保存 且在处理时可能被一起置为1 可能当前正在回收子进程时又有信号来了 此时无法处理 那么这批子进程就无法被回收
    {//因为信号的处理与子进程发送信号是两个执行流并不同步，如果其他子进程发送信号在当前处理信号handler方法之前则会被一起置为0(因为信号不能重复保存，无非也就是将对应的比特位由0置1) 信号就丢失了
        pid_t res = waitpid(-1,NULL,WNOHANG); //-1是等待任意一个子进程 与wait等价 但是设置WNOHANG不会在这里卡住 如果当前没有子进程需要回收就退出 有子进程需要回收就通过信号全部回收
        if(res>0) //res大于0则表示有进程被回收
            cout<<"子进程:"<<res<<"回收！"<<endl;
        else
            break;
    }

    cout<<"handler:子进程回收完成！"<<endl;
}

//使用信号回收子进程 而不让父进程wait 回收进程池
int main()
{
    signal(SIGCHLD,SIG_IGN); //也可以设置信号忽略从而标记进程 操作系统帮我们回收
    //signal(SIGCHLD,handler);
    for(int i = 0;i<10;++i)
    {
        pid_t id = fork();
        if(id == 0)
        {
            int i = 5;
            while(i--)
            {
                cout<<"id2进程行中..."<<endl;
                sleep(1);
            }
            exit(1);
        }
    }


    while(true)
    {
        cout<<"主进程行中..."<<endl;
        sleep(1);
    }

    return 0;
}


